//挡片控制模块，校正分为空闲、关闭、等待稳定、等待存图完成、开启5个状态
//挡片开启和关闭都需要通电只是15ms，只是通电方向相反，本设计通电时间设置为30ms
//挡片不通电时保持原有状态不变（o_motor[0] == o_motor[1]则为不通电状态）
module leaf_ctrl(
	input        clk           ,//使用探测器输出的PC作为clk，频率12MHz
	input        rst_n         ,
	input        leaf_trig     ,//持续1个clk高电平即触发一次挡片校正
	output [1:0] o_motor       ,
	output       o_motor_en    ,//挡片控制使能信号，高有效
	output       img_store_trig,
	input        img_store_done
);
localparam IDLE  = 3'd0;//空闲状态
localparam CLOSE = 3'd1;//关闭状态，驱动电机做关闭挡片动作
localparam DELAY = 3'd2;//等待稳定
localparam WAITD = 3'd3;//等待存图完成
localparam OPEN  = 3'd4;//开启状态，驱动电机做开启挡片动作
reg [2:0] state;
reg [1:0] o_motor_r;
reg       o_motor_en_r;
reg       img_store_trig_r;
reg [31:0] cnt;
assign o_motor        = o_motor_r;
assign o_motor_en     = o_motor_en_r;
assign img_store_trig = img_store_trig_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
    begin
	state            <= IDLE ;
	o_motor_r        <= 2'b00;
	o_motor_en_r     <= 1'b0 ;
	img_store_trig_r <= 1'b0 ;
	cnt              <= 0;
	end
else
    begin
	case(state)
	IDLE:begin
	    state            <= leaf_trig?CLOSE:state;
		o_motor_en_r     <= leaf_trig ;
		o_motor_r        <= 2'b00;
		img_store_trig_r <= 1'b0;
		cnt              <= leaf_trig?360000+100:0;//倒计时30ms，加100的目的是防止误触发I2C
	end
	CLOSE:begin
	    state            <= (|cnt)?state:DELAY;
		o_motor_en_r     <= 1'b1;
		o_motor_r        <= (cnt >= 360000)?2'b00:2'b01;//关闭挡片
		img_store_trig_r <= 1'b0;
		cnt              <= (|cnt)?cnt-1:6000000;//倒计时结束再拨动新的倒计时
	end
	DELAY:begin
		state            <= (|cnt)?state:WAITD;
		o_motor_en_r     <= 1'b1 ;
		o_motor_r        <= 2'b00;//释放挡片（释放不是打开，而是停止通电，挡片会维持状态不变）
		img_store_trig_r <= (|cnt)?1'b0:1'b1;//倒计时结束开始单点校正存图
		cnt              <= (|cnt)?cnt-1:360000;
	end
	WAITD:begin
		state            <= img_store_done?OPEN:state;
		o_motor_en_r     <= 1'b1 ;
		o_motor_r        <= img_store_done?2'b10:2'b00;//单点存图完成则开始打开挡片
		img_store_trig_r <= 1'b0;
		cnt              <= 360000;
	end
	OPEN:begin
	    state            <= (|cnt)?state:IDLE;
		o_motor_en_r     <= 1'b1;
		o_motor_r        <= (|cnt)?2'b10:2'b00;//倒计时结束释放挡片
		img_store_trig_r <= 1'b0;
		cnt              <= (|cnt)?cnt-1:cnt;//倒计时结束再拨动新的倒计时	
	end
	endcase
	end
end
endmodule 